home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / util / cli / SetDTool.lha / SetDTool / SetDTool_09.s < prev    next >
Text File  |  2000-04-06  |  14KB  |  477 lines

  1. *****************************************************************************
  2. *                                        *
  3. *    PROGRAM: SetDTool                            *
  4. *    VERSION: 1.0                                *
  5. *   SOURCE CODE: 9                                *
  6. *       DATE: 21.03.2000                            *
  7. *      LANGUAGE: Assembler (DevPac V3.14)                    *
  8. *     SYSTEM: A1200    KS 40.68 WB 40.42 2MB chip 64MB fast 68030/50mhz    *
  9. *                                        *
  10. *     AUTHOR: Joerg Riemer 14167 Berlin/SchottmuellerStr.107/Germany        *
  11. *      EMAIL: mission@cs.tu-berlin.de                    *
  12. *                                        *
  13. *    COMMENT: cli-command to change the defaulttool defined            *
  14. *         in project-icons.                         *
  15. *                                        *
  16. *      TEMPLATE: FILE/A,TOOL/K,QUIET/S                        *
  17. *                                        *
  18. *****************************************************************************
  19.  
  20. *        opt    d+
  21.  
  22. BSS_Section    set    0
  23.  
  24. *****************************************************************************
  25.  
  26.     output    ram:SetDTool
  27.  
  28. ************************************************ exec definitions ***********
  29.  
  30. _LVOOpenLibrary        equ    -552
  31. _LVOCloseLibrary    equ    -414
  32.  
  33. ************************************************ dos definitions ************
  34.  
  35. _LVOOutput        equ    -060
  36. _LVOIoErr        equ    -132
  37. _LVOFPutC        equ    -312
  38. _LVOFPuts        equ    -342
  39. _LVOFlush        equ    -360
  40. _LVOSetIoErr        equ    -462
  41. _LVOPrintFault        equ    -474
  42. _LVOReadArgs        equ    -798
  43. _LVOFreeArgs        equ    -858
  44. _LVOMatchFirst        equ    -822
  45. _LVOMatchNext        equ    -828
  46. _LVOMatchEnd        equ    -834
  47.  
  48. ap_BreakBits        equ    $008
  49. ap_Flags        equ    $010
  50. ap_Strlen        equ    $012
  51. ap_Info            equ    $014
  52.  
  53. fib_DirEntryType    equ    $004
  54.  
  55. SIGBREAKB_CTRL_C    equ    $00C
  56. SIGBREAKB_CTRL_D    equ    $00D
  57. SIGBREAKB_CTRL_E    equ    $00E
  58. SIGBREAKB_CTRL_F    equ    $00F
  59.  
  60. ************************************************ icon definitions ***********
  61.  
  62. _LVOGetDiskObject    equ    -078
  63. _LVOPutDiskObject    equ    -084
  64. _LVOFreeDiskObject    equ    -090
  65.  
  66. WBPROJECT        equ    $004
  67. do_Type            equ    $030
  68. do_DefaultTool        equ    $032
  69.  
  70. ************************************************ bss datas ******************
  71.  
  72. Anchorpath    rs.b    280            ;size_of anchorpath
  73. PNameOrg    rs.b    256            ;size_of ap_strlen (pathname)
  74. PNameBuf    rs.b    256            ;size_of workbuffer
  75. DOSBase        rs.l    1            ;ptr. base of library
  76. ICOBase        rs.l    1            ;ptr. base of library
  77.  
  78. Filename    rs.l    1            ;argarray ptr. filename
  79. NewDefTool    rs.l    1            ;argarray ptr. newtoolstring
  80. Quiet        rs.b    1            ;argarray flag (no output)
  81. EntryType    rs.b    1            ;flag (found #?.info)
  82. Flag3        rs.b    1            ;pad
  83. Flag4        rs.b    1            ;pad
  84.  
  85. RDArgs        rs.l    1            ;ptr. rdargs structure
  86. RCode1        rs.l    1            ;errorcode > rc
  87. RCode2        rs.l    1            ;errorcode > result2
  88. MatchReturn    rs.l    1            ;errorcode (matchnext)
  89. DObject        rs.l    1            ;ptr. workbench diskobject
  90. OldDefTool    rs.l    1            ;ptr. do_defaulttool
  91. FCount        rs.l    1            ;counter (files proccessed)
  92. StrEnd        rs.l    1            ;ptr. stringend w/o ".info"
  93.  
  94. BSS_Size    rs.b    0            ;bss_size over all
  95.  
  96. *****************************************************************************
  97.  
  98. Start        movem.l    D1-D7/A0-A6,-(SP)    ;save registers
  99.  
  100.         if    BSS_Section        ;check assembler condition
  101.  
  102.         movea.l    Start-4(pc),A5        ;get bss_section
  103.         addq.l    #1,A5            ;skip pointer (next segment)
  104.         adda.l    A5,A5            ;convert bpcl_pointer
  105.         adda.l    A5,A5            ;to real_address
  106.  
  107.         elseif                ;otherwise
  108.  
  109.         lea    DataBase(pc),A5        ;set working area
  110.  
  111.         endc                ;end condition
  112.  
  113. ************************************************ open libraries *************
  114.  
  115.         moveq    #20,D0            ;failat level
  116.         move.l    D0,RCode1(A5)        ;preset error (no library)
  117.  
  118.         movea.l    4.w,A6            ;set EXEC to call a function
  119.  
  120.         moveq    #37,D0            ;required library version
  121.         lea    DOSName(pc),A1        ;set library name
  122.         jsr    _LVOOpenLibrary(A6)    ;use EXEC to (openlibrary)
  123.         move.l    D0,DOSBase(A5)        ;save base
  124.  
  125.         beq.b    CloseLibs        ;branch if not open
  126.  
  127.         moveq    #37,D0            ;required library version
  128.         lea    ICOName(pc),A1        ;set library name
  129.         jsr    _LVOOpenLibrary(A6)    ;use EXEC to (openlibrary)
  130.         move.l    D0,ICOBase(A5)        ;save base
  131.  
  132.         beq.b    CloseLibs        ;branch if not open
  133.  
  134. *****************************************************************************
  135.  
  136.         bsr.b    Main
  137.  
  138. ************************************************ close libraries ************
  139.  
  140. CloseLibs    movea.l    4.w,A6            ;set EXEC to call a function
  141.  
  142.         move.l    ICOBase(A5),D1        ;get base_ptr
  143.         beq.b    CloseDOS        ;branch when not open
  144.         movea.l    D1,A1            ;set base_ptr
  145.         jsr    _LVOCloseLibrary(A6)    ;use EXEC to (closelibrary)
  146.  
  147. CloseDOS    move.l    DOSBase(A5),D1        ;get base_ptr
  148.         beq.b    ExitDOS            ;branch when not open
  149.         movea.l    D1,A1            ;set base_ptr
  150.         jsr    _LVOCloseLibrary(A6)    ;use EXEC to (closelibrary)
  151.  
  152. ExitDOS        move.l    RCode1(A5),D0        ;set returncode
  153.         movem.l    (SP)+,D1-D7/A0-A6    ;restore registers
  154.         rts                ;go back (shell)
  155.  
  156. *****************************************************************************
  157.  
  158. DOSName        dc.b    "dos.library",0
  159. ICOName        dc.b    "icon.library",0
  160.  
  161. *****************************************************************************
  162.  
  163. version    dc.b "$VER: SetDTool 1.0 9 (31.3.00) by joerg riemer mar'00",0
  164.  
  165. *****************************************************************************
  166.  
  167.         even
  168.  
  169. *****************************************************************************
  170.  
  171. Main        clr.l    RCode1(A5)        ;clear returncode
  172.  
  173.         bsr    ReadArgs        ;read user_arguments
  174.         bsr    InitAPath        ;prepare anchorpath
  175.         bsr    MatchFirst        ;search for filename
  176.  
  177. Loop        bsr    CheckEntryType        ;check for dir/file
  178.         bsr    MatchNext        ;do matchnext first!!
  179.         bsr    SetDTool        ;then edit prematched file
  180.  
  181.         tst.b    Quiet(A5)        ;print filename?
  182.         bne.b    Next            ;branch if not
  183.         tst.b    EntryType(A5)        ;found a info_file?
  184.         beq.b    Next            ;branch if not
  185.  
  186.         bsr.b    PrintFName        ;print "path/file"
  187.         bsr.b    PrintComment        ;print "patched!"
  188.  
  189. Next        move.l    MatchReturn(A5),D1    ;check returncode (matchnext)
  190.         beq.b    Loop            ;loop again when ok
  191.  
  192.         cmp.w    #205,D1            ;check for 'file not found'
  193.         beq    Error6            ;branch if so
  194.         cmp.w    #304,D1            ;check for 'user break'
  195.         beq    Error6            ;branch if so
  196.         cmp.w    #232,D1            ;check for 'no more entries'
  197.         bne    Error6            ;branch if so
  198.  
  199.         tst.l    RCode1(A5)        ;check returncode rc
  200.         beq.b    Quit0            ;branch if ok
  201.         st    Quiet(A5)        ;do not printfault!!
  202.         bsr    Error            ;set result2 (replace 232)
  203.  
  204. Quit0        bsr    MatchEnd        ;free memory (anchorpath)
  205.         bsr    FreeArgs        ;free memory (readargs)
  206.         rts                ;go back
  207.  
  208. ************************************************ print path/filename ********
  209.  
  210. PrintFName    move.l    StrEnd(A5),A2        ;restore filename
  211.         move.b    #".",(A2)        ;restore filename
  212.  
  213.         movea.l    DOSBase(A5),A6        ;set dos_base
  214.         jsr    _LVOOutput(A6)        ;search output_handle
  215.  
  216.         move.l    D0,D1            ;set output
  217.         lea    PNameBuf(A5),A2        ;get filename to print
  218.         move.l    A2,D2            ;prepare dos_fputs
  219.         jsr    _LVOFPuts(A6)        ;use dos to fputs
  220.  
  221. .Ready        rts                ;go back
  222.  
  223. ************************************************ print newline character ****
  224.  
  225. PrintNLine    movea.l    DOSBase(A5),A6        ;set dos_base
  226.         jsr    _LVOOutput(A6)        ;search output_handle
  227.         move.l    D0,D1            ;set output
  228.         moveq    #$A,D2            ;set char. to print
  229.         jsr    _LVOFPutC(A6)        ;use dos to fputc
  230.         rts                ;go back
  231.  
  232. ************************************************ print comment "patched!" ***
  233.  
  234. PrintComment    movea.l    DOSBase(A5),A6        ;set dos_base
  235.         jsr    _LVOOutput(A6)        ;search output_handle
  236.  
  237.         move.l    D0,D1            ;set output
  238.         lea    Text(pc),A2        ;get filename to print
  239.         move.l    A2,D2            ;prepare dos_fputs
  240.         jsr    _LVOFPuts(A6)        ;use dos to fputs
  241.         rts                ;go back
  242.  
  243. *****************************************************************************
  244.  
  245. Text        dc.b    " patched!",$A,0
  246.  
  247. ************************************************ set default tool ***********
  248.  
  249. SetDTool    tst.b    EntryType(A5)        ;found a info_file?
  250.         beq    Ready            ;branch if not
  251.  
  252. *********************** read [#?.info] file ****
  253.  
  254.         move.l    StrEnd(A5),A2        ;remove suffix [.info]
  255.         clr.b    (A2)            ;remove suffix [.info]
  256.  
  257.         lea    PNameBuf(A5),A0        ;set filename
  258.         move.l    ICOBase(A5),A6        ;set library_base
  259.         jsr    _LVOGetDiskObject(A6)    ;use icon to getdiskobject
  260.         move.l    D0,DObject(A5)        ;got it?
  261.         beq    Error3            ;branch if not
  262.  
  263. *********************** check for project.info *
  264.  
  265.         move.l    D0,A0            ;set diskobject
  266.         cmp.b    #WBPROJECT,do_Type(A0)    ;check for project_icon
  267.         bne    Error5            ;branch if not
  268.  
  269. *********************** set new defaulttool ****
  270.  
  271.         move.l    do_DefaultTool(A0),OldDefTool(A5) ;save old defauft
  272.         move.l    NewDefTool(A5),do_DefaultTool(A0) ;set new default
  273.  
  274.         movea.l    A0,A1            ;set diskobject
  275.         lea    PNameBuf(A5),A0        ;set name used to put
  276.         jsr    _LVOPutDiskObject(A6)    ;use icon to putdiskobject
  277.         tst.l    D0            ;save file failed?
  278.         beq    Error4            ;branch if so
  279.  
  280.         clr.l    RCode1(A5)        ;clear returncode rc
  281.         clr.l    RCode2(A5)        ;clear returncode pr_result2
  282.  
  283.         addq.l    #1,FCount(A5)        ;inc. files proccessed
  284.  
  285. ************************************************ free memory (disobject) ****
  286.  
  287. FreeDObject    move.l    DObject(A5),A0        ;get diskobject
  288.         move.l    OldDefTool(A5),do_DefaultTool(A0) ;restore deftool
  289.  
  290.         movea.l    ICOBase(A5),A6        ;set icon_base
  291.         jsr    _LVOFreeDiskObject(A6)    ;use icon to freediskobject
  292. Ready        rts                ;go back
  293.  
  294. ************************************************ matchnext pattern **********
  295.  
  296. MatchNext    lea    Anchorpath(A5),A1    ;get anchorpath structure
  297.         move.l    A1,D1            ;prepare matchnext
  298.         movea.l    DOSBase(A5),A6        ;set dos_base
  299.         jsr    _LVOMatchNext(A6)    ;use dos to matchnext
  300.         move.l    D0,MatchReturn(A5)    ;save return_code
  301.         rts                ;go back
  302.  
  303. ************************************************ free memory matchfirst/next
  304.  
  305. MatchEnd    lea    Anchorpath(A5),A1    ;get anchorpath structure
  306.         move.l    A1,D1            ;prepare matchend
  307.         movea.l    DOSBase(A5),A6        ;set dos_base
  308.         jsr    _LVOMatchEnd(A6)    ;use dos to matchend
  309.         rts                ;go back
  310.  
  311. ************************************************ test for #?.info file ******
  312.  
  313. CheckEntryType    lea    ap_Info(A5),A0        ;get fileinfoblock
  314.         tst.l    fib_DirEntryType(A0)    ;type = file ?
  315.         bpl.b    .Ready            ;branch, type is directory
  316.  
  317.         lea    PNameOrg(A5),A0        ;get filename
  318.         lea    PNameBuf(A5),A1        ;set buffer
  319. .CopyString    move.b    (A0)+,(A1)+        ;copy string
  320.         bne.b    .CopyString        ;until end
  321.  
  322.         subq    #6,A1            ;search for suffix '.info'
  323.         cmp.b    #".",(A1)        ;first test
  324.         bne.b    .Ready            ;branch if fail
  325.  
  326.         move.l    A1,StrEnd(A5)        ;set string_end w/o suffix
  327.         addq    #1,A1            ;skip '.'
  328.         move.b    (A1)+,D0        ;second test, get char
  329.         bset    #5,D0            ;set lowercase
  330.         rol.l    #8,D0            ;make room for next char
  331.         move.b    (A1)+,D0        ;get char
  332.         bset    #5,D0            ;set lowercase
  333.         rol.l    #8,D0            ;make room for next char
  334.         move.b    (A1)+,D0        ;get char
  335.         bset    #5,D0            ;set lowercase
  336.         rol.l    #8,D0            ;make room for next char
  337.         move.b    (A1)+,D0        ;get char
  338.         bset    #5,D0            ;set lowercase
  339.         cmp.l    #"info",D0        ;suffix = '.info' ?
  340.  
  341. .Ready        seq    EntryType(A5)        ;set if so
  342.         rts                ;go back
  343.  
  344. ************************************************ matchfirst pattern *********
  345.  
  346. MatchFirst    move.l    Filename(A5),D1        ;get user pattern/file
  347.         lea    Anchorpath(A5),A2    ;get anchorpath
  348.         move.l    A2,D2            ;used for matching
  349.         movea.l    DOSBase(A5),A6        ;set dos_base
  350.         jsr    _LVOMatchFirst(A6)    ;use dos to matchfirst
  351.         move.l    D0,RCode2(A5)        ;save returncode
  352.         bne    Error2            ;branch on error
  353.         rts                ;else, go back
  354.  
  355. ************************************************ prepare anchorpath *********
  356.  
  357. InitAPath    moveq    #00,D0            ;prepare register
  358.         bset    #SIGBREAKB_CTRL_C,D0    ;do break on <CTRL><C> !!!
  359.         move.l    D0,ap_BreakBits(A5)    ;set bit
  360.         move.w    #256,ap_Strlen(A5)    ;set length of string_buffer
  361.         rts                ;go back
  362.  
  363. ************************************************ read arguments *************
  364.  
  365. ReadArgs    lea    Template(pc),A1        ;get template
  366.         lea    Filename(A5),A2        ;get arg_array
  367.         move.l    A1,D1            ;set arg_template
  368.         move.l    A2,D2            ;set array
  369.         moveq    #0,D3            ;set args (unused)
  370.         movea.l    DOSBase(A5),A6        ;set dos_base
  371.         jsr    _LVOReadArgs(A6)    ;use dos to readargs
  372.         move.l    D0,RDArgs(A5)        ;save returncode
  373.         beq    Error1            ;branch on wrong args
  374.         rts                ;else, go back
  375.  
  376. ************************************************ free argument buffer *******
  377.  
  378. FreeArgs    move.l    RDArgs(A5),D1        ;get arg_structure
  379.         beq.b    .Ready            ;branch if not set
  380.         move.l    DOSBase(A5),A6        ;set dos_base
  381.         jsr    _LVOFreeArgs(A6)    ;use dos to freeargs
  382. .Ready        rts                ;go back
  383.  
  384. ************************************************ error handling *************
  385.  
  386. Error6        move.l    D1,RCode2(A5)        ;set errorcode
  387.         pea    Quit0(pc)        ;set return_address
  388.         bra.b    Error            ;print error
  389.  
  390. ************************************************
  391.  
  392. Error5        bsr    FreeDObject        ;free allocated diskobject
  393.  
  394.         tst.b    Quiet(A5)        ;do all quiet ?
  395.         bne.b    .Skip            ;branch if so
  396.  
  397.         bsr    PrintFName        ;else, print filename
  398.         bsr    PrintNLine        ;print newline
  399.  
  400. .Skip        move.l    #212,RCode2(A5)        ;error 'not of required type'
  401.         addq    #4,SP            ;clear return_address
  402.         pea    Next(pc)        ;set new one
  403.         bra.b    Error            ;print error
  404.  
  405. ************************************************
  406.  
  407. Error4        bsr    FreeDObject        ;free allocated diskobject
  408.  
  409.         tst.b    Quiet(A5)        ;do all quiet ?
  410.         bne.b    Error3            ;branch if so
  411.  
  412.         bsr    PrintFName        ;else, print filename
  413.         bsr    PrintNLine        ;print newline
  414.  
  415. ************************************************
  416.  
  417. Error3        addq    #4,SP            ;clear return_address
  418.         pea    Quit0(pc)        ;set new one
  419.         bra.b    Error0            ;print error
  420.                         
  421. ************************************************
  422.  
  423. Error2        addq    #4,SP            ;clear return_address
  424.         pea    Quit0(pc)        ;set new one
  425.         bra.b    Error            ;print error
  426.  
  427. ************************************************
  428.  
  429. Error1        addq    #4,SP            ;clear return_address
  430.  
  431. ************************************************
  432.  
  433. Error0        movea.l    DOSBase(A5),A6        ;set dos_base
  434.         jsr    _LVOIoErr(A6)        ;use dos to get ioerr
  435.         move.l    D0,RCode2(A5)        ;save as pr_result2
  436.  
  437. ************************************************
  438.  
  439. Error        move.l    RCode2(A5),D1        ;get errorcode
  440.         movea.l    DOSBase(A5),A6        ;set dos_base
  441.         jsr    _LVOSetIoErr(A6)    ;use dos to set pr_result2
  442.  
  443.         tst.b    Quiet(A5)        ;do all quiet ?
  444.         bne.b    .SetRCode1        ;branch if so
  445.  
  446.         move.l    RCode2(A5),D1        ;get errorcode
  447.         lea    Header(pc),A2        ;get head_text 'ERROR:'
  448.         move.l    A2,D2            ;set header
  449.         jsr    _LVOPrintFault(A6)    ;use dos to printfault
  450.  
  451. .SetRCode1    moveq    #5,D0            ;set returncode rc=warn
  452.         move.l    D0,RCode1(A5)        ;save
  453.         rts                ;go back
  454.  
  455. *****************************************************************************
  456.  
  457. Template    dc.b    "FILE/A,TOOL/K,QUIET/S",0
  458. Header        dc.b    "ERROR",0
  459.  
  460. *****************************************************************************
  461.  
  462.         if    BSS_Section
  463.  
  464.         SECTION    SetDTool_bss,BSS
  465.  
  466.         elseif
  467.  
  468.         cnop    0,4
  469.  
  470.         endc
  471.  
  472. *****************************************************************************
  473.  
  474. DataBase    ds.b    BSS_Size
  475.  
  476.  end of source **************************************************************
  477.